home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Technotools
/
Technotools (Chestnut CD-ROM)(1993).ISO
/
lang_c
/
c_windw
/
textedit.c
< prev
next >
Wrap
Text File
|
1987-12-28
|
9KB
|
285 lines
/* (c) Marietta Systems, Inc. 1987
* All rights reserved
*/
#include "mtest.h"
/*
*
* Program to demonstrate use of ascii files
* A simple text editor
*
*/
unsigned maxsize = 20000;
unsigned maxrecs = 253;
void delline(int*, int, int);
void editfile(char*, int*, int*);
int getfile(char*, char*, int*, int*);
void insline(int*, int, int);
void linedisp(char*, int*, int, int);
void putfile(int, char*, char*, int*, int);
void scrndisp(char*, int*, int, int*, int);
void show_nbr(int, int);
/*
*
* Function to obtain file and read it in
*
*/
int getfile(fname, text, lineptr, len)
char *fname, *text;
int *lineptr;
int *len;{
long rec_nbr;
int z, slen, fh, ret;
byte out[20], *ptr;
/* setup */
strcpy(fname, "textfile.dat");
top_spot(1);
for (z = 0 ; z < 8 ; KEYMATCH[z++] = 0); /* blank out function keys */
disp_err("",1); /* display new function key settings */
for (z = 0, slen = 0 ; z < maxrecs; z++, slen += 79)
{lineptr[z] = slen; text[slen] = 0;}/* initialize out line ptr */
/* */
for(;;){
display("Text file to edit - ", 19, 1, low);
if (accept(fname, left, alt_reverse, 51, 0) && INCHAR == QUIT)
goodbye(0);
if ((fh = fileopen(fname, ascii, readonly)) < 0)
{disp_err("File name or access error",1); continue;}
disp_err(fname, 1);
if (!fh) if (!disp_qry("File not found, Create")) continue;
else {*len = 0; ptr = fname;
for (z = 0 ; z < strlen(fname) && fname[z] != '.' ; z++)
if (fname[z] == '\\') ptr = &fname[z+1];
display(ptr, 1, 50, reverse);
return 0;}
display((byte*)FN[fh].fname, 1, 50, reverse);
fileseek(fh, -1L); /* position to end of file */
if (FN[fh].location >= (long)maxsize)
{disp_err("File is too big for editor", 1);
fileclos(fh); continue;}
fileinit(fh, 0, 81, 0L); /* Max record width is set to 80 */
*len = 0; text[0] = 0;
if (!fh) return 0; /* new text file */
/* read in the text and set up line pointers */
rec_nbr = 0L;
if (fileread(fh, firstrec, &rec_nbr) <= 0) goodbye(10);
ptr = text;
display ("Loading text file ", 21, 1, high);
for (; rec_nbr < (long)maxrecs;){
slen = strlen(FN[fh].record);
FN[fh].record[slen-1] = 0; /* replace the '\n' with 0 */
strncpy(ptr, FN[fh].record, 78); ptr = &ptr[79];
if ((ret = fileread(fh, nextrec, &rec_nbr)) < 0)
goodbye(11);
if (!ret) {*len = (int)rec_nbr - 2;
fileclos(fh); return fh;} /* EOF */
if (!(rec_nbr & 0X3F)) /* print rec_nbr every 48 */
{sprintf(out, "%lu", rec_nbr);
display(out, 21, 20, reverse);}
}
disp_err("File contains too many records", (int)rec_nbr);
fileclos(fh);
continue;
} /* end of main for loop */
} /* end of function getedit*/
/*
*
* Function editfile
*
*/
void editfile(text, lineptr, len)
char *text;
int *lineptr;
int *len;{
int h, top = 0, x = 1, bottom;
/* setup */
display("\030 \031 Ctrl+Home Ctrl+End PgUp PgDn", 1, 2, low);
if (mk_wndw(TOP_LINE+2, 1, SCRN_LEN - 1, 80,
" 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75")
< 0) goodbye(20);
KEYMATCH[0] = 0XA38; /* PgDn, Crs-up, Crs-rt, Tab, Shift-Tab */
KEYMATCH[1] = 0X10C; /* PgUp, Crs-dn, Crs-lt */
KEYMATCH[4] = 0X3000; /* F5, F6 */
KEYMATCH[7] = 0X1400; /* Ctrl+end, Ctrl+home */
KEYMATCH[2] = KEYMATCH[3] = KEYMATCH[5] = KEYMATCH[6] = 0;
disp_err("",1); /* force display of control keys */
h = WINDOW[W_NUM].H - 1; /* lines in screen */
scrndisp(text, lineptr, top, &bottom, *len); /* initial display */
A_TRACK = 0; INCHAR = ENTER; x = 0;
/* main for loop */
for (;;){
switch((int)INCHAR){
case CRS_LT:
case SFT_TAB: A_TRACK = 78 - 1;
case CRS_UP: if (!(--x))
if (!top) {x = 1; A_TRACK = 0;} /* at TOF */
else {scroll(-1, 0);
linedisp(text, lineptr, --top, (x = 1));
if (top + h <= bottom) bottom--;}
break;
case ENTER:
case CRS_RT:
case TAB: A_TRACK = 0;
case CRS_DN: if ((++x) > h)
if (bottom >= *len) {x = h; A_TRACK = 78 - 1;}
else {scroll(1, 0); top++;
linedisp(text, lineptr, ++bottom, (x = h));}
if (INCHAR != ENTER)
{if (top + x > *len) {x--; A_TRACK = 78 - 1;}
break;}
if (top + x <= bottom) break;
case INSERT: if (*len == maxrecs) break;
insline(lineptr, top + x, *len);
scroll(-1, x - 1);
A_TRACK = 0;
text[lineptr[top + x - 1]] = 0;
*len += 1;
break;
case DELETE: if (!*len) break;
delline(lineptr, top + x, *len);
scroll(1, x - 1);
if (*len > bottom) linedisp(text, lineptr, bottom, h);
else {bottom--; if (x > bottom - top) x--;}
*len -= 1;
break;
case PGUP: top -= h; if (top < 0) top = 0;
scrndisp(text, lineptr, top, &bottom, *len);
break;
case PGDN: if (bottom >= *len) break;
top += h;
scrndisp(text, lineptr, top, &bottom, *len);
if (x > bottom - top) x = bottom - top;
break;
case CTL_HOME: top = 0; x = 1;
scrndisp(text, lineptr, top, &bottom, *len);
break;
case CTL_END: top = *len - h;
if (top < 0) top = 0;
scrndisp(text, lineptr, top, &bottom, *len);
x = bottom - top;
break;
case QUIT: if (disp_qry("Have you finished editing")) return;
break;
default: disp_err("Invalid function key", 1); break;
} /* end switch */
set_crsr(x, 1);
show_nbr(top + x, *len);
if (accept(&text[lineptr[top+x-1]], as_typed, alt_reverse, 78, 0)
< 0) goodbye(10);
} /* end for loop */
} /* end function editfile */
/*
*
* Function to display a line on screen
*
*/
void linedisp(text, lineptr, nbr, x)
char *text;
int *lineptr;
int nbr, x;{
byte line[81];
justify(as_typed, line, &text[lineptr[nbr]], 78, 0);
display(line, x, 1, ACC_DISP);
}
/*
*
* Function to re_display screen on edit
*
*/
void scrndisp(text, lineptr, top, bottom, len)
char *text;
int *lineptr, top, *bottom, len;{
int h = WINDOW[W_NUM].H - 1, k, x;
byte line[81];
*bottom = top + h ;
if (*bottom >= len) *bottom = len;
for (x = 1, k = top ; x <= h && k < *bottom ; x++, k++)
linedisp(text, lineptr, k, x);
if (x > h) return;
memset(line, 32, 78); line[78] = 0; /* blank bottom of screen */
for (; x <= h ; display(line, x++, 1, ACC_DISP));
} /* end of function scrndisp */
/*
*
* Function to insert pointer in lineptr
*
*/
void insline(lineptr, k, len)
int *lineptr, k, len;{
int z = len - k, save = lineptr[len];
if (z <= 0) return; /* pointer already at EOT */
memcpy ((char*)&lineptr[k], (char*)&lineptr[k - 1], ++z * sizeof(int));
lineptr[k - 1] = save;
}
/*
*
* Function to delete pointer from lineptr
*
*/
void delline(lineptr, k, len)
int *lineptr, k, len;{
int z = len - k, save = lineptr[k - 1];
if (!z) return; /* pointer at EOT */
memcpy((char*)&lineptr[k - 1], (char*)&lineptr[k], ++z * sizeof(int));
lineptr[len] = save;
}
/*
*
* Function to show current record location on screen
*
*/
void show_nbr(loc, len)
int loc;
int len;{
char text[16];
set_clr(99, low); /* use error status color */
sprintf(text, "%3u of %-3u", loc, len);
scrn_map(text, TOP_LINE + 1, 69); /* hairy technique */
set_clr(98, low); /* reset color */
}
/*
*
* Function to store new file to disc
*
*/
void putfile(fh, fname, text, lineptr, len)
char *fname, *text;
int fh, *lineptr, len;{
long rec_nbr = 0L;
int z;
if (fh && fileback(fname) < 1) goodbye(30);
fh = fileopen(fname, ascii, recreate);
fileinit(fh, 0, 81, 0L);
if (fh <= 0) goodbye(31);
for (z = 0 ; z < len ; z++){
strcpy(FN[fh].record, &text[lineptr[z]]); /* copy to record area */
concat(FN[fh].record, 0); /* strip trailing spaces */
strcat(FN[fh].record, "\n"); /* Add the '\n' char */
if (filewrit(fh, &rec_nbr)) goodbye(32);
if (!(rec_nbr & 0XF))
disp_msg("Writing to disc - record",(int)rec_nbr);
}
disp_msg("",0);
fileclos(fh);
rm_wndw();
}
/*
*
* Main program
*
*/
void main(){
int len = 0;
int fh, *lineptr;
char *text, fname[66];
/* setup */
clr_scrn("Text Editor");
text = malloc(maxsize); /* assign workarea */
lineptr = (int*) malloc(sizeof(int) * maxrecs);
if (text == NULL || lineptr == NULL) goodbye(1);
/* edit */
if ((fh = getfile(fname, text, lineptr, &len)) < 0) goodbye(2);
editfile(text, lineptr, &len);
putfile(fh, fname, text, lineptr, len);
disp_err("ready for goodbye", 11); idleloop(18);
goodbye(0);
}